package com.example.springstack.mybatisplus.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.springstack.mybatisplus.dao.UserMapper;
import com.example.springstack.mybatisplus.entity.User;
import com.example.springstack.mybatisplus.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * @author qiangfanghao
 * @date
 */

@Slf4j
@Service("userService")
public class UserServiceImpl extends ServiceImpl<UserMapper, User>
        implements UserService {




    /**
     * 开启事务管理注解: @Transactional
     * Transactional关键参数:
     *  propagation:事务的转播行为(不清楚)
     *  islation:事务的隔离级别
     * 	    脏读:一个未提交的事务读取到另一个未提交事务的数据
     * 	    不可重复读
     * 	    幻读
     *  timeout:超时时间,事务的提交超时时间,默认为 -1
     *  readOnly:是否只读
     *  rollbackFor:回滚,设置出现哪些异常进行回滚
     *  noRollbackFor:不回滚,设置出现哪些异常不进行回滚
     *
     *
     *  事务失效情况参考,详细请参考思维导图:
     *  1.IO异常
     * 2.private访问权限导致失效,因为事务底层基于AOP实现
     * 3.final修复方法,因为事务底层aop实现
     * 4.方法内部调用
     * 5.未被spring容器管理
     * 6.多线程调用
     * 7.错误的传播特性(不清楚啥意思)
     * 8.自己吞异常,try catch捕获了异常后未抛出,事务也不会回滚
     * 9.嵌套事务回滚多了
     * @param user
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void addUser(User user) {

        this.baseMapper.insert(user);
        int i = 1 / 0;
    }

}
